home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 19
/
Aminet 19 (1997)(GTI - Schatztruhe)[!][Jun 1997].iso
/
Aminet
/
gfx
/
board
/
rtgmasdev.lha
/
demos
/
mandel
/
mandel.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-03-24
|
8KB
|
294 lines
/*
RTG Library Usage Demo - MandelBrot Generator
*/
//* "Includes"
/* Generic "Include Everything"-type file */
#include <math.h>
#include <stdlib.h>
#include <proto/utility.h>
#include <proto/exec.h>
#include <clib/rtgmaster_protos.h>
#include <clib/exec_protos.h>
#include <clib/utility_protos.h>
#include <pragmas/rtgmaster_pragmas.h>
#include <pragmas/exec_pragmas.h>
#include <pragmas/utility_pragmas.h>
#include <exec/memory.h>
#include <utility/tagitem.h>
#include <rtgmaster/rtgmaster.h>
#include <rtgmaster/rtgsublibs.h>
#include <rtgmaster/rtgc2p.h>
#include <proto/rtgmaster.h>
#include "timer.h"
#include <string.h>
#include <stdio.h>
//*
//* "Globals"
struct RtgScreen *RtgScreen;
struct ScreenReq *sr;
struct RTGMasterBase *RTGMasterBase;
struct Library *UtilityBase, *IntuitionBase;
struct Library *GfxBase;
struct TagItem rtag[] = {
smr_ChunkySupport, -1,
smr_PlanarSupport, 0,
smr_PrefsFileName, (Tag)"MandelRTG.prefs",
TAG_DONE, NULL
};
struct TagItem gtag[] = {
grd_BytesPerRow, 0,
grd_Width, 0,
grd_Height, 0,
grd_Depth, 0,
grd_PixelLayout, 0,
grd_ColorSpace, 0,
grd_PlaneSize, 0,
grd_BusSystem, 0,
TAG_DONE, 0
};
struct TagItem tacks[] = {
TAG_DONE,0
};
BOOL Planar;
UBYTE *cbuf=NULL;
ULONG width;
UBYTE *sadr;
ULONG cmap[800];
ULONG size;
#define CBUF 76800
typedef struct {
float x,y;
} complex;
const MAX=256;
/*
* This is done using an ugly direct hardware hit
* Should be an input handler or similar in future versions/real-life
* applications!
*/
extern int MouseButton(void);
//*
//* "fail"
void fail(void) {
if (RtgScreen) CloseRtgScreen(RtgScreen);
if (RTGMasterBase) CloseLibrary((struct Library *)RTGMasterBase);
if (UtilityBase) CloseLibrary(UtilityBase);
if (cbuf) FreeVec(cbuf);
exit(0L);
}
//*
//* "Iterate"
int iterate(complex zInit) {
complex z;
float a,b;
int cnt;
z=zInit;
cnt=0;
while ((z.x*z.x+z.y*z.y<=4.0) && (cnt<MAX)) {
a=z.x*z.x-z.y*z.y;
b=2*z.x*z.y;
z.x=a; z.y=b;
z.x+=zInit.x;
z.y+=zInit.y;
cnt++;
}
return cnt;
}
//*
//* "Mandelbrot"
void Mandelbrot(float rMin, float rMax, float iMin, float iMax,
int cols, int rows) {
float rInc, iInc;
int x,y,count;
complex zInit;
rInc=(rMax-rMin)/(float)cols;
iInc=(iMax-iMin)/(float)rows;
zInit.x=rMin;
for (x=0; x<cols; x++) {
zInit.y=iMin;
for (y=0; y<cols; y++) {
count=iterate(zInit);
WriteRtgPixel(RtgScreen,sadr,x,y,count);
zInit.y+=iInc;
if (MouseButton()) return;
}
zInit.x+=rInc;
}
}
//*
//* "main"
void main(int argc, char *argv[]) {
/*
* Since this is a demo, I don't check anything at all
* and simply assume that every open went ok... 8-)
*/
int i,x;
struct TagItem *tag;
UBYTE rr, rg, rb;
ULONG width, height;
float iMin, iMax, rMin, rMax;
rMin=-2.25; rMax=0.75;
iMin=-1.25; iMax=1.25;
if (argc>1) rMin=atof(argv[1]);
if (argc>2) rMax=atof(argv[2]);
if (argc>3) iMin=atof(argv[3]);
if (argc>4) iMax=atof(argv[4]);
RTGMasterBase = (struct RTGMasterBase *)OpenLibrary((STRPTR)"rtgmaster.library", 0);
UtilityBase = OpenLibrary((STRPTR)"utility.library", 37L);
IntuitionBase = OpenLibrary("intuition.library", 37L);
GfxBase = OpenLibrary("graphics.library", 37L);
sr = RtgScreenModeReq(rtag);
if (sr==NULL) fail();
RtgScreen = OpenRtgScreen(sr, tacks);
GetRtgScreenData(RtgScreen, gtag);
tag=FindTagItem(grd_BytesPerRow, gtag);
size = tag->ti_Data;
tag=FindTagItem(grd_Width, gtag);
width = tag->ti_Data;
tag=FindTagItem(grd_PixelLayout, gtag);
if (tag->ti_Data != grd_PLANAR && tag->ti_Data != grd_CHUNKY) {
printf("Screenmode not supported\n");
fail();
}
printf("Screen pixel layout is ");
switch(tag->ti_Data) {
case grd_PLANAR: printf("planar\n"); break;
case grd_PLANATI: printf("interleaved planar\n"); break;
case grd_CHUNKY: printf("8-Bit Z-Ordered (chunky)\n"); break;
case grd_HICOL15: printf("15-Bit Chunky (2 Byte/pixel)\n"); break;
case grd_HICOL16: printf("16-Bit Chunky (2 Byte/pixel)\n"); break;
case grd_TRUECOL24: printf("24-Bit Chunky (3 Byte/pixel)\n"); break;
case grd_TRUECOL24P: printf("24-Bit Chunky (3 Byteplanes/pixel)\n"); break;
case grd_TRUECOL32: printf("24-Bit Chunky (4 Bytes/pixel)\n"); break;
case grd_GRAFFITI: printf("Graffiti 8 bit\n"); break;
case grd_TRUECOL32B: printf("24-Bit Chunky (4 Bytes/pixel)\n"); break;
default: printf("unknown (%d)\n", tag->ti_Data); break;
}
tag=FindTagItem(grd_ColorSpace, gtag);
if (tag->ti_Data) {
printf("Color space is ");
switch(tag->ti_Data) {
case grd_Palette: printf("CLUT-Based\n"); break;
case grd_RGB: printf("RGB (low-endian RGB)\n"); break;
case grd_BGR: printf("BGR (high-endian RGB)\n"); break;
default: printf("unknown (%d)\n", tag->ti_Data); break;
}
}
tag=FindTagItem(grd_BusSystem, gtag);
if (tag->ti_Data) {
printf("Graphics card bus is ");
switch(tag->ti_Data) {
case grd_Z3: printf("Zorro III\n"); break;
case grd_Z2: printf("Zorro II\n"); break;
case grd_Custom: printf("default custom chips\n"); break;
case grd_RGBPort: printf("conneted to the RGB Port\n"); break;
case grd_GVP: printf("GVP Special Bus (EGS110)\n"); break;
case grd_DDirect: printf("DracCo® Direct\n"); break;
default: printf("an unknown bus system\n"); break;
}
}
if (tag->ti_Data == grd_PLANAR) Planar = TRUE;
else Planar = FALSE;
tag=FindTagItem(grd_Width, gtag);
if (tag) width=tag->ti_Data;
tag=FindTagItem(grd_Height, gtag);
if (tag) height=tag->ti_Data;
printf("Screen is %ld x %ld x %ld\n", width, height, gtag[3].ti_Data);
printf("It has %ld bytes per row\n", size);
if (Planar == TRUE) {
cbuf = AllocVec(CBUF, MEMF_CLEAR|MEMF_FAST);
if (cbuf==NULL) {
cbuf=AllocVec(CBUF, MEMF_CLEAR);
if (cbuf==NULL) {
printf("Out of memory *SIGH*\n");
fail();
}
}
}
cmap[0] = 256 * 65536;
rr = 0;
rg = 0;
rb = 0;
x = 1;
for (i = 0; i < 64; i++) {
cmap[x++] = rr * 0x1111111;
cmap[x++] = rg * 0x1111111;
cmap[x++] = rb * 0x1111111;
rr += 3;
}
for (i = 0; i < 127; i++) {
cmap[x++] = rr * 0x1111111;
cmap[x++] = rg * 0x1111111;
cmap[x++] = rb * 0x1111111;
rg += 3;
}
for (i = 0; i < 60; i++) {
cmap[x++] = rr * 0x1111111;
cmap[x++] = rg * 0x1111111;
cmap[x++] = rb * 0x1111111;
rb += 3;
}
for (i = 0; i < 4; i++) {
cmap[x++]=0xFFFFFFFF;
cmap[x++]=0xFFFFFFFF;
cmap[x++]=0xFFFFFFFF;
}
cmap[x]=0;
LockRtgScreen(RtgScreen);
LoadRGBRtg(RtgScreen, (APTR) cmap);
UnlockRtgScreen(RtgScreen);
if (RtgScreen) {
LockRtgScreen(RtgScreen);
sadr = (UBYTE *)GetBufAdr(RtgScreen,0);
//Mandelbrot(-1.08816, -0.93391, 0.36621, 0.25723, width, height);
Mandelbrot(rMin, rMax, iMin, iMax, width, height);
while (MouseButton()==0);
UnlockRtgScreen(RtgScreen);
CloseRtgScreen(RtgScreen);
}
CloseLibrary(GfxBase);
CloseLibrary((struct Library *)RTGMasterBase);
CloseLibrary(UtilityBase);
CloseLibrary(IntuitionBase);
}
//*